package Day18;

public class Day18 {
    public static void main(String[] args) {
        //一般将释放资源的操作放入finally中 -> 放入try(){}的小括号中

        //throw关键字 抛出异常 程序发生错误无法处理 会抛出对应的异常对象
                   //部分代码虽然可以运行 但是不满足业务需求 可以抛出(满足语法 不满足业务需求)

        //throw异常的作用类似return 一旦触发 下方代码就不执行了

        //第一行at 异常的原发位置
        //第二行at 原发位置没有处理异常 抛回了报错代码处
        //第三行at 报错代码处也没有处理异常的方法 此时会隐式的抛出main方法外给系统 系统杀死程序
        //...

        //throws关键字 用在方法 用于声明这个方法将会抛出异常 若在写程序时不制定异常处理机制 则异常还是会被抛出
                    //  (丑话说前面)

        //所有异常都需要提前声明 对外声明要抛出该异常 除了RuntimeException

        //继续向外抛出还是直接捕获处理 要看该异常是否归你管

        //子类重写带有throws的方法时对于throws重写的规则

        //检查异常与非检查异常 编译器检查 检查的内容是 有没有处理手段
        //RuntimeException和它的子类型 非检查异常 编译器不会提醒 属于bug 逻辑漏洞导致 完全可以通过修改代码规避
        //空指针异常 下标越界异常 不合法字符异常(IllegalArgumentException) 造型异常 数据类型转换异常(NumberFormatException)

        //e.printStackTrace() 输出执行堆栈信息 输出捕获的异常信息

        //自定义异常

        //网络编程
        /*
            root权限 超级用户 谁掌握root权限 设备就是谁的 用户画像 按照泄露的个人信息分析大数据 画出个人具体行为

            苹果AppStore上架app是需要审查源代码的 且完全闭源 只能在AppStore中下载软件 有效保护用户隐私

            扩展坞
         */

        //socket编程 在java.net.Socket包中
        //socket(插座)---套接字
        //什么是计算机网络
        //网络标准API 进行可靠的网络通讯
        //IP地址 四段 每段三位数 用于唯一标识网络上的计算机
        //APP也会有各自的端口号(0-65535) 用于标识具有网络功能的应用程序
        //0-1024 众所周知的端口 用于系统深度绑定完成各种功能
        //6000以前的端口号 热门软件也都固定占用
        //8000以后 端口比较松散 不容易重复
        //Client客户端(用户) --> Server服务端(应用程序服务器...)
        //(C/S谁发起连接 谁就是客户端 接受连接 就是服务端 服务端可以同时接受多个客户端的连接)---(B/C结构 浏览器和服务端)

        //ServerSocket 总机本身有一个总体的端口 能让客户端找到总机位置申请连接 总机分配端口给申请方 构建两个申请方的连接

        //localhost 本机 固定写法 不需要写IP地址了就 127.0.0.1也表示本机

        //阻塞 程序在运行 但是不往下走了 例如Scanner 只有回车才会继续
        //快捷键 win+R 输入cmd 输入ipconfig 查询IP地址  172.198.2.155

        //先启动服务端 等待连接 阻塞中accept...
        //启动客户端 到服务端端口 被检测到 建立连接

        //可靠传输(例如TCP协议) -- 不可靠传输(例如UDP协议)
        //TCP 慢
        //数据传输会有损失 为了解决或缓解 协议规定 勤拿少取
        //分段成一个个包 一个包发完 对方返回信号再发下一个包 若规定时间不返回信号 则判定丢包 重新发送该包
        //UDP 快
        //仍然是按包发 但是不管你收没收到 我就说一遍 没收着不会重复问 会继续发
        //量大 劲足 火力大 例如实时视频 直播画面等 保证即时性 有时候游戏卡了 过一会儿会瞬移 这就是UDP传输数据时
        //中间位置的信息包丢了 而TCP也有用来保证即时性的措施 例如游戏卡了 丢包了 过一会收到包后 画面会快进到最新的位置



        //三次握手 四次挥手(面试题)
        //TCP协议在建立连接和断开连接时的发生的
        //握手 客户端发起 和服务端建立连接
        //挥手 双方都可能发起
        //三次握手的原理
        //1 客户端对服务端说 在吗 客户端等待回复
        //2 服务端收到了 回复说 我可以听到 并说 你能听到吗 客户端了解到对方能听到 但不确定对方能不能听到
        //3 客户端给服务端回复服务端表示自己可以听到
        //四次挥手(以客户端发起为例)
        //1 客户端说 我没话说了 服务端了解到 1)客户端想断开了 2)客户端没有数据需要传输了
        //2 服务端说 收到 但是你先别断 因为我还没说完 客户端知道 1)对方知道我想断开 2)对方知道我不会发数据了
        //3 服务端会将剩余的数据发送到客户端 并且不会再接受上层服务器下发的新数据了 保证短时间内传输完数据 传完数据后 将"我发完了"这句话发给客户端 客户端知道对方能断开了
        //4 客户端说 ok 断开吧 服务端收到后 安全断开连接


        //最需要关的流是低级流 创建流时是在socket下创建的 socket.close() 低级流自然也关了

        //就算在客户端finally写了close 有可能也会异常 不可抗力


    }
}
